草庐IT

javascript oop、instanceof 和基类

全部标签

c# - 显式标记派生类为基类的实现接口(interface)

interfaceIBase{stringName{get;}}classBase:IBase{publicBase()=>this.Name="Base";publicstringName{get;}}classDerived:Base//,IBase{publicDerived()=>this.Name="Derived";publicnewstringName{get;}}classProgram{staticvoidMain(string[]args){IBaseo=newDerived();Console.WriteLine(o.Name);}}在这种情况下,输出将为“Bas

c# - 将派生类永久转换为基类

ClassA{}ClassB:A{}BItemB=newB();AItemA=(A)B;Console.WriteLine(ItemA.GetType().FullName);是否可以像上面那样做一些事情并让编译器打印出类型A而不是类型B。基本上,是否可以永久转换对象以使其“丢失”所有派生数据? 最佳答案 您所要求的是不可能的,原因有二:ItemA.GetType()不返回变量ItemA的编译时类型-它返回运行时类型ItemA引用的对象。您无法使(A)B导致表示更改转换(即新的A对象),因为用户定义的转换运算符(您唯一的希望在这里)

c# - 具有基类和不同实现配置选项的自动映射器

我有两个类(MVCView模型)继承自一个抽象基类。abstractclassBaseModel{}classCar:BaseModel{publicstringSpeed{get;set;}}classCamper:BaseModel{publicintBeds{get;set;}}并希望使用基类配置AutoMapper,例如:Mapper.CreateMap();varsomeObj=newDataDastination();Mapper.Map(instanceOfBaseModel,someObj);这里我得到错误,因为Automapper没有Car或Camper的配置。尝试用

c# - 如何在事先不知道类型的情况下使用 XmlSerializer 反序列化可能属于基类或派生类的对象?

在C#中,如何在事先不知道类型的情况下使用XmlSerializer反序列化可能属于基类或任何派生类的对象?我的所有派生类都添加了额外的数据成员。我制作了一个简单的GUI,可以序列化和反序列化类对象。它会根据用户选择填充的字段将对象序列化为合适的继承类(甚至只是基类)。我对序列化没有任何问题;问题是反序列化。在事先不知道类的情况下,我怎么可能让XmlSerializer将数据反序列化为正确的派生类?我目前创建了一个XmlReader来读取XML文件的第一个节点并从中确定类,它似乎适合我的目的,但它似乎是一个非常不优雅的解决方案。我在下面发布了一些示例代码。有什么建议吗?BaseType

c# - 我应该在每个类还是在基类中声明一次 log4net 记录器?

声明一个记录器并在基类中调用LogManager.GetLogger似乎更干净,这样每个继承人都可以使用它。但是,在log4net站点和其他博客上,如thisblogpost它声明最好为每个类声明一个记录器,因为:Youcanuseloggersthiswaytoisolateloggingconcernsacrossyourobjects,andIwhollyrecommendyoudoso.Thiswillenableyoutothrottleanddirectlogoutputfromindividualloggersusinglog4net'shierarchicalconfi

C# 从内部基类中获取派生类型的名称

在调试session期间,在特定实例的调试信息中识别实际派生类的名称对我来说很重要。我尝试使用this.GetType().Name但这只会返回base类的类型。有没有一种简单的方法可以从基类中获取派生类的类型? 最佳答案 this.GetType().Name应该有效。我认为,就您而言,您可能没有派生类。如果它返回基类名称,则它不应该有派生类。使用这个:基类-输出基类名称派生类-输出派生类名派生类转换为基类-输出派生类名派生类传递给接受基类作为参数的函数-输出派生类名 关于C#从内部基

c# - 具有类型约束或基类参数的通用方法

如果我编写一个接受派生自BaseClass(或接口(interface))的参数的方法,据我所知有两种方法可以实现:voidMyMethod(Tobj)whereT:BaseClass{...}和voidMyMethod(BaseClassobj){...}这两种方法有什么区别? 最佳答案 在此示例中,两者之间没有太大区别,您可以在方法内部访问相同的成员,并且可以使用相同的派生类调用它。存在运行时差异,因为泛型方法是针对调用它的每种类型进行编译的。如果您根据T返回一个值,泛型就会派上用场使用泛型你可以做以下事情TMyMethod(T

c# - 为什么基类必须有一个带 0 个参数的构造函数?

这不会编译:namespaceConstructor0Args{classBase{publicBase(intx){}}classDerived:Base{}classProgram{staticvoidMain(string[]args){}}}相反,我收到以下错误:'Constructor0Args.Base'doesnotcontainaconstructorthattakes0arguments这是为什么呢?基类有必要有一个0参数的构造函数吗? 最佳答案 它不是-问题是它需要调用一些基础构造函数,以初始化基础类型和默认就是

c# - 为什么不能将成员方法传递给基类构造函数?

classFlarg{privatereadonlyActionspeak;publicActionSpeak{get{returnspeak;}}publicFlarg(Actionspeak){this.speak=speak;}}classMuteFlarg:Flarg{publicMuteFlarg():base(GiveDumbLook){}privatevoidGiveDumbLook(){}}编译器给出错误“非静态字段、方法或属性‘Project.Namespace.Class.GiveDumbLook’需要一个对象。这似乎与将Action作为参数传递给任何其他方法没有什

C#使用反射复制基类属性

我想使用反射将所有属性从MyObject更新到另一个。我遇到的问题是特定对象是从基类继承的,并且这些基类属性值未更新。以下代码复制顶级属性值。publicvoidUpdate(MyObjecto){MyObjectcopyObject=...FieldInfo[]myObjectFields=o.GetType().GetFields(BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Instance);foreach(FieldInfofiinmyObjectFields){fi.SetValue(copyObject,f